﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;

namespace ProjetoSolo.QueroGas.Dominio.Entidades
{
    public class Empresa : Entidade
    {        
        private string nome;
        private Endereco endereco;
        private Usuario usuario;
        private IList<Telefone> telefones;
        private IList<Produto> produtos; 
        private IList<Distribuidora> distribuidoras;

        public string Email { get; set; }

        public Empresa()
        {
            this.Ativa = true;
            this.telefones = new List<Telefone>();
            this.distribuidoras = new List<Distribuidora>();
            this.produtos = new List<Produto>();
            this.Email = "";
        }

        public Empresa(string nome) : this()
        {
            this.Nome = nome;
        }

        public Empresa(string nome, Endereco endereco, IList<Telefone> telefones, IList<Produto> produtos) : this(nome)
        {
            this.Endereco = endereco;
            this.telefones = telefones;
            this.produtos = produtos;
        }

        public int Codigo { get; private set; }
        public bool Ativa { get; set; }

        [DisplayName("nome")]
        [Required(ErrorMessage = "O preenchimento do Nome da Empresa é obrigatório.")]
        [StringLength(50, MinimumLength = 2, ErrorMessage = "O nome da empresa deve ter entre 2 e 50 letras ")]
        public string Nome 
        {
            get { return this.nome; }
            set
            {
                Validator.ValidateProperty(value, new ValidationContext(this) { MemberName = "Nome"}); 
                this.nome = value;
            } 
        }        
        
        [Required(ErrorMessage = "A empresa precisa de um endereço válido para ser localizada no mapa.")]
        public Endereco Endereco
        {
            get { return this.endereco; }
            set
            {
                Validator.ValidateProperty(value, new ValidationContext(this) { MemberName = "Endereco"});
                this.endereco = value;
            }
        }

        //[Required(ErrorMessage = "Uma empresa não pode existir sem um usuário associado.")]
        public Usuario Usuario
        {
            get { return this.usuario; }
            set
            {
                Validator.ValidateProperty(value, new ValidationContext(this) {MemberName = "Usuario"});
                this.usuario = value;
            }
        }        

        //[Required(ErrorMessage = "A empresa precisa de pelo menos um telefone.")]
        //public IEnumerable<Telefone> Telefones { get { return this.telefones; } }

        public IList<Telefone> Telefones 
        {
            get { return this.telefones; }
            set { this.telefones = value; }
        }

        //[Required(ErrorMessage = "A empresa precisa definir ao menos um distribuidora.")]
        public IList<Distribuidora> Distribuidoras 
        {
            get { return this.distribuidoras; }
            set { this.distribuidoras = value; }
        }
       
        //[Required(ErrorMessage = "A empresa precisa de pelo menos um produto")]
        public IEnumerable<Produto> Produtos { get { return this.produtos;  } }

        public void AdicionarTelefone(Telefone telefone)
        {
            if(this.telefones.Contains(telefone))
                return;
            
            this.telefones.Add(telefone);
        }

        public void RemoverTelefone(Telefone telefone)
        {
            if (this.telefones.Contains(telefone))
                telefones.Remove(telefone);
        }

        public void AdicionarProduto(Produto produto)
        {
            if(this.produtos.Contains(produto))
                return;

            this.produtos.Add(produto);
        }

        public void RemoverProduto(Produto produto)
        {
            if (this.produtos.Contains(produto))
                this.produtos.Remove(produto);
        }

        public void AdicionarDistribuidora(Distribuidora distribuidora)
        {
            if (this.distribuidoras.Contains(distribuidora))
                return;

            this.distribuidoras.Add(distribuidora);
        }

        public void RemoverDistribuidora(Distribuidora distribuidora)
        {
            if (this.distribuidoras.Contains(distribuidora))
                this.distribuidoras.Remove(distribuidora);
        }

        public bool TemEndereco()
        {
            return this.Endereco != null;
        }

        public bool TemTelefone()
        {
            return this.telefones.Count > 0;
        }

        public bool TemProduto()
        {
            return this.produtos.Count > 0;
        }

        public bool TemDistribuidora()
        {
            return this.distribuidoras.Count > 0;
        }
    }
}
